;
; Ullrich von Bassewitz, 31.05.1998
; Christian Krueger: 12-Aug-2013, minor optimizations
;
; char* strncat (char* dest, const char* src, size_t n);
;

.export         _strncat
.import         popax, popptr1
.importzp       ptr1, ptr2, ptr3, tmp1, tmp2

_strncat:
        inx
        stx     tmp2
        tax
        inx
        stx     tmp1        ; save count with each byte incremented separately

        jsr     popptr1     ; get src

        jsr     popax       ; get dest
        sta     ptr3        ; remember for function return
        stx     ptr3+1
        stx     ptr2+1
        tay             ; low byte as offset in Y
.if .cap(CPU_HAS_STZ)
        stz     ptr2
.else
        ldx     #0
        stx     ptr2        ; destination on page boundary
.endif

; find end of dest

L1:     lda     (ptr2),y
        beq     L2
        iny
        bne     L1
        inc     ptr2+1
        bne     L1

; end found, apply offset to dest ptr and reset y
L2:     sty     ptr2

; copy src. We've put the ones complement of the count into the counter, so
; we'll increment the counter on top of the loop

L3:     ldy     #0
        ldx     tmp1        ; low counter byte

L4:     dex
        bne     L5
        dec     tmp2
        beq     L6          ; jump if done
L5:     lda     (ptr1),y
        sta     (ptr2),y
        beq     L7
        iny
        bne     L4
        inc     ptr1+1
        inc     ptr2+1
        bne     L4

; done, set the trailing zero and return pointer to dest

L6:     lda     #0
        sta     (ptr2),y
L7:     lda     ptr3
        ldx     ptr3+1
        rts
